package com.ruoyi.system.service.impl;

import java.util.Date;
import java.util.List;
import java.util.UUID;

import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.TbDownloadTokenMapper;
import com.ruoyi.system.domain.TbDownloadToken;
import com.ruoyi.system.service.ITbDownloadTokenService;

/**
 * 下载令牌Service业务层处理
 *
 * @author ruoyi
 * @date 2025-09-01
 */
@Service
public  class TbDownloadTokenServiceImpl implements ITbDownloadTokenService {
    @Autowired
    private TbDownloadTokenMapper tbDownloadTokenMapper;


    /**
     * 生成下载令牌
     *
     * @param fileUrl  文件URL
     * @param createBy 创建者标识
     * @return 下载令牌
     */
    @Override
    public String generateDownloadToken(String fileUrl, String createBy) {
        // 检查是否已存在有效的相同文件URL的令牌
        TbDownloadToken existingToken = tbDownloadTokenMapper.selectValidByFileUrl(fileUrl);
        if (existingToken != null) {
            return existingToken.getToken();
        }

        // 生成新的GUID令牌
        String token = generateGuid();

        // 创建令牌记录
        TbDownloadToken downloadToken = new TbDownloadToken();
        downloadToken.setToken(token);
        downloadToken.setFileUrl(fileUrl);
        downloadToken.setStatus(1);
        downloadToken.setCreateTime(new Date());
        downloadToken.setCreateBy(createBy);

        try {
            tbDownloadTokenMapper.insertTbDownloadToken(downloadToken);
            return token;
        } catch (DuplicateKeyException e) {
            // 递归调用重新生成（冲突概率极低）
            return generateDownloadToken(fileUrl, createBy);
        } catch (Exception e) {
            throw new RuntimeException("生成下载令牌失败");
        }
    }

    /**
     * 验证令牌有效性
     *
     * @param token 令牌
     * @return 文件URL
     */
    @Override
    public String validateToken(String token) {
        TbDownloadToken downloadToken = tbDownloadTokenMapper.selectValidByToken(token);
        if (downloadToken == null) {
            throw new RuntimeException("下载令牌无效或已过期");
        }
        return downloadToken.getFileUrl();
    }

    /**
     * 使令牌失效
     *
     * @param token 令牌
     * @return 是否成功
     */
    @Override
    public boolean invalidateToken(String token) {
        try {
            int result = tbDownloadTokenMapper.invalidateByToken(token);
            return result > 0;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 生成GUID
     */
    private String generateGuid() {
        return UUID.randomUUID().toString().replace("-", "");
    }


    /**
     * 查询下载令牌
     *
     * @param id 下载令牌主键
     * @return 下载令牌
     */
    @Override
    public TbDownloadToken selectTbDownloadTokenById(Long id) {
        return tbDownloadTokenMapper.selectTbDownloadTokenById(id);
    }

    /**
     * 查询下载令牌列表
     *
     * @param tbDownloadToken 下载令牌
     * @return 下载令牌
     */
    @Override
    public List<TbDownloadToken> selectTbDownloadTokenList(TbDownloadToken tbDownloadToken) {
        return tbDownloadTokenMapper.selectTbDownloadTokenList(tbDownloadToken);
    }

    /**
     * 新增下载令牌
     *
     * @param tbDownloadToken 下载令牌
     * @return 结果
     */
    @Override
    public int insertTbDownloadToken(TbDownloadToken tbDownloadToken) {
        tbDownloadToken.setCreateTime(DateUtils.getNowDate());
        return tbDownloadTokenMapper.insertTbDownloadToken(tbDownloadToken);
    }

    /**
     * 修改下载令牌
     *
     * @param tbDownloadToken 下载令牌
     * @return 结果
     */
    @Override
    public int updateTbDownloadToken(TbDownloadToken tbDownloadToken) {
        tbDownloadToken.setUpdateTime(DateUtils.getNowDate());
        return tbDownloadTokenMapper.updateTbDownloadToken(tbDownloadToken);
    }

    /**
     * 批量删除下载令牌
     *
     * @param ids 需要删除的下载令牌主键
     * @return 结果
     */
    @Override
    public int deleteTbDownloadTokenByIds(Long[] ids) {
        return tbDownloadTokenMapper.deleteTbDownloadTokenByIds(ids);
    }

    /**
     * 删除下载令牌信息
     *
     * @param id 下载令牌主键
     * @return 结果
     */
    @Override
    public int deleteTbDownloadTokenById(Long id) {
        return tbDownloadTokenMapper.deleteTbDownloadTokenById(id);
    }


}
